package chipwits.operator;

import java.awt.Color;
import java.awt.Graphics;

/**
 * 
 * @author Emmanuel Roussel
 */
public class Arrow {

// ******************   déclarations des variables statiques  ******************
    public final static int ARROW_WIDTH = 10;
    public final static int ARROW_LENGTH = 16;        //longueur et largeur des fleches
    private static Graphics g = null;

    public static enum Direction {     //liste des différentes directions que peut avoir une fleche
        HAUT,
        DROITE,
        BAS,
        GAUCHE
    };

    // ******************   Fonctions statiques   ******************
    public static void setGraphics(Graphics g) {
        Arrow.g = g;
    }

    // ******************   déclarations des variables   ******************

    private Direction dir;      //contient la direction de la fleche
    private final Color VERT = new Color(0f, 0.8f, 0f, 0.6f);
    private final Color ROUGE = new Color(0.9f, 0f, 0f, 0.6f);
    private final Color TRANSP = new Color(0.4f, 0.4f, 0f, 0.2f);
    private final Color VIDE = new Color(0f, 0f, 0f, 0f);       //effacer
    private Color color;        //couleur de la fleche
    private int x, y;       //position de la fleche sur le panel
    private boolean active;     //si true : tracée  l'écran, si false : invisible.
    private boolean type;       //true : fleche verte, false : fleche rouge
    private boolean select;     //si true, la fleche est sélectionnée => on la met en transparent

// ******************   constructeurs   ******************
    private Arrow() {
    }   //empecher le constructeur par défaut

    public Arrow(int x, int y, Direction dir, boolean activate, boolean type) {
        this.x = x;
        this.y = y;
        this.dir = dir;
        this.color = VIDE;
        this.select = false;
        this.type = type;
        this.active = activate;
        updateColor();
    }


// ******************   accesseurs   ******************
    //changer le type de la fleche (true : vert, false : rouge)
    public void setType(boolean type) {
        this.type = type;
        updateColor();
    }

    public boolean getType() {
        return type;
    }

    public void setActive(boolean active) {
        this.active = active;
        updateColor();
    }

    public boolean isActive() {
        return active;
    }

    public void setSelect(boolean select){
        this.select = select;
        updateColor();
    }

// ******************   Autres fonctions   ******************

    private void updateColor() {     //mets à jour la couleur de la fleche en fonction de son type et de son état.
        if (active) {
            if (type == true) {
                this.color = VERT;
            } else {
                this.color = ROUGE;
            }
        } else {
            if (select) {
                this.color = TRANSP;
            } else {
                this.color = VIDE;
            }
        }
        redraw();
    }
    
    //trace la fleche
    public void redraw() {
        if (g == null) {
            return;
        }
        if (this.isActive() || this.color == TRANSP) {
            g.setColor(this.color);
            if (dir == Direction.HAUT) {
                g.fillPolygon(new int[]{x - ARROW_WIDTH / 2, x, x + ARROW_WIDTH / 2}, new int[]{y, y - ARROW_LENGTH, y}, 3);
            } else if (dir == Direction.DROITE) {
                g.fillPolygon(new int[]{x, x + ARROW_LENGTH, x}, new int[]{y - ARROW_WIDTH / 2, y, y + ARROW_WIDTH / 2}, 3);
            } else if (dir == Direction.BAS) {
                g.fillPolygon(new int[]{x - ARROW_WIDTH / 2, x, x + ARROW_WIDTH / 2}, new int[]{y, y + ARROW_LENGTH, y}, 3);
            } else if (dir == Direction.GAUCHE) {
                g.fillPolygon(new int[]{x, x - ARROW_LENGTH, x}, new int[]{y - ARROW_WIDTH / 2, y, y + ARROW_WIDTH / 2}, 3);
            }
        }
    }

}
